package main

import "sync"

var (
	mu      sync.Mutex
	balance int
)

func Deposit3(amount int) {
	mu.Lock()
	balance = balance + amount
	mu.Unlock()
}

func Balance3() int {
	mu.Lock()
	defer mu.Unlock()
	return balance
}

func Withdraw3(amount int) bool {
	// 当取款金额大于余额时，导致回退这次取款之前的其他并发小额取款失败
	// 在Withdraw3中使用mu会产生死锁，因为sync.Mutex不是可重入的
	// 解决不可重入的问题，可以再实现一个deposit3（小写，未导出，只供包内调用），与Deposit3逻辑相同，但不使用mu
	Deposit3(-amount)
	if Balance3() < 0 {
		Deposit3(amount)
		return false
	}
	return true
}
